#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#include "FastLED.h"            // 此示例程序需要使用FastLED库
#define NUM_LEDS 1024             // LED灯珠数量
#define DZ1 23              // Arduino输出控制信号引脚 长点阵控制引脚
#define DD1 33              // 上灯带控制引脚（四边形）
#define DIN1 26             // 振动传感器的数字输入引脚
// #define DZ1 25              // Arduino输出控制信号引脚
#define LED_TYPE WS2812B         // LED灯带型号
#define COLOR_ORDER GRB         // RGB灯珠中红色、绿色、蓝色LED的排列顺序
 
uint8_t max_bright = 255;       // LED亮度控制变量，可使用数值为 0 ～ 255， 数值越大则光带亮度越高
CRGB leds_DZ1[NUM_LEDS];            // 建立点阵leds
CRGB leds_DD1[NUM_LEDS];            // 建立点阵leds
// 初始化函数
void setup() {
  pinMode(DIN1, INPUT_PULLDOWN);                                  // 设置数字端口2为输入模式
  LEDS.addLeds<LED_TYPE, DZ1, COLOR_ORDER>(leds_DZ1, NUM_LEDS);   // 初始化点阵
  LEDS.addLeds<LED_TYPE, DD1, COLOR_ORDER>(leds_DD1, NUM_LEDS);   // 初始化点阵
  FastLED.setBrightness(max_bright);                              // 设置灯带亮度
}
// 点亮所有灯珠
void light_all()
{
  // fill_sold section全部点亮/熄灭，没有时间差
  fill_solid(leds_DZ1, NUM_LEDS, CRGB::Blue);
  FastLED.show();
  delay(500);

  fill_solid(leds_DZ1, NUM_LEDS, CRGB::Black);
  FastLED.show();
  delay(500);
}

// 通过for循环来点亮所有的WS2812B
void light_all_via_for()
{
  for (int i=0;i<NUM_LEDS;i++)
  {
    leds_DZ1[i] = CRGB::Blue; // 设置灯带中第一个灯珠颜色为红色，leds[0]为第一个灯珠，leds[1]为第二个灯珠
  }
  FastLED.show();             // 更新LED色彩
  delay(500); 
  for (int i=0;i<NUM_LEDS;i++)
  {
    leds_DZ1[i] = CRGB::Black;// 设置灯带中第一个灯珠颜色为红色，leds[0]为第一个灯珠，leds[1]为第二个灯珠          
  }
  FastLED.show();             // 更新LED色彩
  delay(500);                 // 等待500毫秒
}

//跑马灯程序
void run_horse_led(int delay_time)
{
  int delay_t = delay_time;
  for(int i=0; i < NUM_LEDS-5;i++)
  {
    fill_solid(leds_DZ1+i, 5, CRGB::Blue);
    FastLED.show();
    delay(delay_t);

    fill_solid(leds_DZ1+i, 5, CRGB::Black);
    FastLED.show();
    delay(delay_t);
  }

  for(int i=NUM_LEDS-5; i > 0;i--)
  {
    fill_solid(leds_DZ1+i, 5, CRGB::Blue);
    FastLED.show();
    delay(delay_t);

    fill_solid(leds_DZ1+i, 5, CRGB::Black);
    FastLED.show();
    delay(delay_t);
  }
}

CHSV my_hsv_color(0,255,255);
// 通过HSV色彩空间进行颜色的改变
void hsv_color_change()
{
  fill_solid(leds_DZ1, NUM_LEDS, my_hsv_color);
  FastLED.show();
  my_hsv_color.h++;
  // my_hsv_color.v++;
  delay(1);
}
//跑马灯程序+HSV色彩空间颜色变化程序
void hsv_horse_color_change(int delay_time)
{
  //跑马灯程序
  int delay_t = delay_time;
  for(int i=0; i < NUM_LEDS-5;i++)
  {
    fill_solid(leds_DZ1+i, 5, my_hsv_color);
    my_hsv_color.h++;
    FastLED.show();
    delay(delay_t);

    fill_solid(leds_DZ1+i, 5, CRGB::Black);
    FastLED.show();
    delay(delay_t);
  }

  for(int i=NUM_LEDS-5; i > 0;i--)
  {
    fill_solid(leds_DZ1+i, 5, my_hsv_color);
    my_hsv_color.h++;
    FastLED.show();
    delay(delay_t);

    fill_solid(leds_DZ1+i, 5, CRGB::Black);
    FastLED.show();
    delay(delay_t);
  }
}

//彩虹色渐变固定不变
void rain_bow_solid()
{
  fill_rainbow(leds_DZ1, NUM_LEDS, 0);
  FastLED.show();
}
uint8_t the_color = 0;
uint8_t change_step = 3;

//彩虹色渐变流动
void rain_bow_fluid()
{
  fill_rainbow(leds_DZ1, NUM_LEDS, the_color, change_step);
  FastLED.show();
  the_color++;  // 为什么这个一直加不会超过有效的最大数值，因为这个变量的类
                // 型是uint8_t，最大只会保存到255，所以不会超过255的
  // change_step+=0.1;  // 这一句没啥用
}

//光滑过渡显示两种颜色，并且可以决定起始灯珠位置和终止灯珠位置
void gradient_clor()
{
  fill_gradient(leds_DZ1, 0, CHSV(50, 255, 255), NUM_LEDS, CHSV(150, 255, 255), LONGEST_HUES);
  FastLED.show();
}

uint8_t startIndex = 0;
//色板函数
void palette_color()
{
  startIndex++;
  // lED光带对象 灯珠数量 起始颜色序号 灯珠间色差 色板名称 亮度 颜色过渡效果(NOBLEND)
  fill_palette(leds_DZ1, NUM_LEDS, startIndex, 8, LavaColors_p, 255, LINEARBLEND);
  fill_palette(leds_DD1, NUM_LEDS, startIndex, 8, CloudColors_p, 255, LINEARBLEND);
  FastLED.show();
}

bool flag = 0;
// 敲击之后熄灭
void bounce_LED()
{
  if(digitalRead(DIN1)==HIGH)
    { 
      fill_solid(leds_DZ1, NUM_LEDS, CRGB::Black);
      fill_solid(leds_DD1, NUM_LEDS, CRGB::Black);
      FastLED.show();
      if (flag == 0)
      {
        flag = 1;
      }
      else
      {
        flag = 0;
      }
    }
  else
    {
      if (flag == 1)
      {
        startIndex++;
        fill_palette(leds_DZ1, NUM_LEDS, startIndex, 8, LavaColors_p, 255, LINEARBLEND);
        fill_palette(leds_DD1, NUM_LEDS, startIndex, 8, CloudColors_p, 255, LINEARBLEND);
        FastLED.show();
      }
      else
      {
        fill_solid(leds_DZ1, NUM_LEDS, CRGB::Black);
        fill_solid(leds_DD1, NUM_LEDS, CRGB::Black);
        FastLED.show();
      }
    }
}

void loop() {
  // bounce_LED();
  palette_color();
  // fill_solid(leds_DZ1+511, 512, CRGB::Green);
  // FastLED.show();
  // gradient_clor();
  // rain_bow_fluid();
  // rain_bow_solid();
  // hsv_horse_color_change(1);
  // hsv_color_change();
  // run_horse_led(1);
}

